import key from 'keymaster' // 需要先安装keymaster

// 截取事件定义key的权重层级。#后面的数字部分
const getKeyIndexFun = (keyStr) => {
  let index = keyStr.lastIndexOf('#')
  return index === -1 ? 0 : Number(keyStr.substr(index + 1))
}
// 获取#前的组合键声明字符串
const getKeyGroupFun = (keyStr) => {
  let index = keyStr.lastIndexOf('#')
  let result = index === -1 ? keyStr : keyStr.substr(0, index)
  return result
}
// 获取已注册事件列表里面最高层级的事件和全局事件（99层级）
const getEventMax = (events) => {
  let globalKeys = []
  let inds = events.map(v => {
    let level = getKeyIndexFun(v.key)
    if(level === 99) {
      globalKeys.push(v.key)
    }
    // 排除99层级的注册事件
    return level === 99 ? -1 : level
  })
  // 除99以外的最高层级
  let curMax = Math.max(...inds)
  // 最高层级对应的事件注册列表
  let maxKeys = events.filter(v => {
    let level = getKeyIndexFun(v.key)
    return level === curMax
  }).map(v => v.key)
  // 返回全局事件和当前页面的最高层级的事件
  return [...maxKeys, ...globalKeys]
}
// 获取以event_key开始的事件
const getEventKeys = (eMap) => {
  let events = []
  eMap.forEach((v, k) => {
    if(k.substring(0, 10) === 'event_key_' && v.length) {
      events.push({ key: k})
    }
  })
}
// 触发事件流程，高层级事件覆盖所有低层级
const doEventTriggerHandle = (keyStr) => {
  let allEvents = window.$mitt.all || [] // 已注册事件列表
  let elist = getEventKeys(allEvents) // 已event_key_开头的事件列表
  let maxKeys = getEventMax(elist) // 最高层级键盘事件
  let aimKeys = maxKeys.filter(v => keyStr === getKeyGroupFun(v))
  aimKeys.forEach(v => {
    window.$mitt.emit(v)
  })
}

export default function() {
  key.filter = function() {
    return true
  }
  for(var i = 0; i < 26; i++) {
    let v = `alt+${String.fromCharCode(97 + i)}`
    key(v, () => {
      doEventTriggerHandle(`event_key_${v}`)
    })
  }
}

// 使用
// import keyMasterInit from './shortKeyGroup'
// window.$keyMaster = keyMasterInit()